package top.sqdpt.pt.statemachine;

/**
 * 定义事件的行为
 *
 * @param <S> 状态枚举
 * @param <E> 事件枚举
 */
public interface PtEasyStateAction<S extends Enum<S>, E extends Enum<E>> extends PtStateAction<S> {
    /**
     * 开始状态
     */
    S getStartState();

    /**
     * 结束状态
     */
    S getTargetState();

    /**
     * 事件
     */
    E getEvent();

    /**
     * 守卫处理
     *
     * @param s       开始状态
     * @param t       结束状态
     * @param context 上下文
     * @return 如果为true则会继续执行handle，如果为false则不会执行后续逻辑
     */
    boolean guard(S s, S t, Object context) throws Exception;

    /**
     * 行为处理
     *
     * @param s       开始状态
     * @param t       结束状态
     * @param context 上下文
     * @throws Exception 异常情况会触发onFail
     */
    void handle(S s, S t, Object context) throws Exception;

    /**
     * 当前面的步骤抛出异常，则会触发onFail
     *
     * @param s       开始状态
     * @param t       结束状态
     * @param context 上下文
     */
    void onFail(S s, S t, Object context);
}
